package com.edu.scnu.show;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JPanel;

import com.edu.scnu.element.ElementObj;
import com.edu.scnu.element.Play;
import com.edu.scnu.manager.ElementManager;
import com.edu.scnu.manager.GameElement;

/**
 * @说明：游戏的主要面板
 * @author 14737
 * @功能说明 主要进行元素的显示，同时进行界面的刷新(多线程)
 * @多线程刷新 1.本类实现线程接口
 * 			 2.本类中定义一个内部类来是实现
 */
public class GameMainJPanel extends JPanel implements Runnable{
	// 联动管理器
	private ElementManager em;

	public GameMainJPanel() {
		init();
		this.setBackground(Color.black);
	}
	
	public void init() {
		em = ElementManager.getManager(); // 得到元素管理器对象
	}
	
	/**
	 * paint方法是进行绘画元素
	 * 绘画时有固定的顺序，先绘画的图片会在底层，后绘画的图片会覆盖先绘画的
	 * 约定：本方法只执行一次，想实时刷新需要使用多线程
	 */
	@Override // 用于绘画的 Graphics 画笔 专门用于绘画的
	public void paint(Graphics g) {
		super.paint(g); // 调用父类的paint方法

		Map<GameElement, List<ElementObj>> all = em.getGameElements();
		for(GameElement ge: GameElement.values()) {
			List<ElementObj> list = all.get(ge);
			for(int i = 0; i < list.size(); i++) {
				ElementObj obj = list.get(i); // 调用为基类
				obj.showElement(g); // 调用每个类的自己的show方法完成自己的显示
			}
		}
		
	}
	@Override
	public void run() { // 接口实现
		while(true) {
			this.repaint();
			// 一般情况下，多线程都会使用一个休眠，用于控制速度
			try {
				Thread.sleep(10); // 休眠10毫秒 1秒刷新100次
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

}
